<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
<!-- English Revision: 1725855 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->

<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<manualpage metafile="env.xml.meta">

  <title>Apache et les variables d'environnement</title>

  <summary>
     <p>Deux types de variables d'environnement affectent le serveur
     HTTP Apache.</p>

    <p>Le premier type correspond aux variables d'environnement
    contrôlées par le système d'exploitation sous-jacent et définies
    avant le démarrage du serveur. Leurs valeurs peuvent être utilisées
    directement dans les fichiers de configuration, et peuvent
    éventuellement être transmises aux scripts CGI et SSI via la
    directive PassEnv.</p>

    <p>Le second type correspond aux variables nommées appelées aussi
    <em>variables d'environnement</em> dans lesquelles le serveur HTTP
    Apache stocke des informations via un mécanisme spécial. Ces
    informations peuvent servir à contrôler diverses opérations comme
    l'enregistrement des traces ou le contrôle d'accès. On utilise aussi ces
    variables dans le mécanisme de communication avec les programmes externes
    comme les scripts CGI. Ce document présente différentes méthodes pour
    manipuler et utiliser ces variables.</p>

    <p>Bien que ces variables soient référencées comme <em>variables
    d'environnement</em>, il ne faut pas les confondre avec les variables
    d'environnement contrôlées par le système d'exploitation sous-jacent.
    En fait, ces variables sont stockées et manipulées dans une structure
    interne à Apache. Elles ne deviennent de véritables variables
    d'environnement du système d'exploitation que lorsqu'elles sont mises à la
    disposition de scripts CGI et de scripts inclus côté serveur (SSI). Si vous
    souhaitez manipuler l'environnement du système d'exploitation sous lequel
    le serveur s'exécute, vous devez utiliser les mécanismes standards de
    manipulation de l'environnement fournis par l'interpréteur de commandes
    (shell) de votre système d'exploitation.</p>
  </summary>

  <section id="setting">
    <title>Définition des variables d'environnement</title>
    <related>
      <modulelist>
        <module>mod_cache</module>
        <module>mod_env</module>
        <module>mod_rewrite</module>
        <module>mod_setenvif</module>
        <module>mod_unique_id</module>
      </modulelist>
      <directivelist>
        <directive module="mod_setenvif">BrowserMatch</directive>
        <directive module="mod_setenvif">BrowserMatchNoCase</directive>
        <directive module="mod_env">PassEnv</directive>
        <directive module="mod_rewrite">RewriteRule</directive>
        <directive module="mod_env">SetEnv</directive>
        <directive module="mod_setenvif">SetEnvIf</directive>
        <directive module="mod_setenvif">SetEnvIfNoCase</directive>
        <directive module="mod_env">UnsetEnv</directive>
      </directivelist>
    </related>

    <section id="basic-manipulation">
        <title>Manipulations de base de l'environnement</title>

        <p>La méthode la plus élémentaire pour définir une variable
	d'environnement au niveau d'Apache consiste à utiliser la directive
	inconditionnelle <directive module="mod_env"
        >SetEnv</directive>. Les variables peuvent aussi être transmises depuis
	l'environnement du shell à partir duquel le serveur a été démarré en
	utilisant la directive
        <directive module="mod_env">PassEnv</directive>.</p>

    </section>
    <section id="conditional">
        <title>Définitions conditionnelles en fonction des requêtes</title>

        <p>Pour plus de souplesse, les directives fournies par le module
        <module>mod_setenvif</module> permettent de définir les
	variables d'environnement en tenant compte des caractéristiques
	de chaque requête. Par exemple, une
	variable pourrait n'être définie que lorsqu'un navigateur spécifique
	(User-Agent) a généré la requête, ou seulement quand un en-tête
	Referer particulier est présent. La directive
	<directive module="mod_rewrite">RewriteRule</directive> du module
	<module>mod_rewrite</module> qui utilise l'option
	<code>[E=...]</code> pour définir
	les variables d'environnement apporte encore plus de souplesse.</p>

    </section>
    <section id="unique-identifiers">
        <title>Identifiants uniques</title>

        <p>Finalement, le module <module>mod_unique_id</module> définit la variable
	d'environnement <code>UNIQUE_ID</code> pour chaque requête à une valeur
	qui est garantie unique parmi "toutes" les requêtes 
	sous des conditions très spécifiques.</p>

    </section>
    <section id="standard-cgi">
        <title>Variables CGI standards</title>

        <p>En plus de l'ensemble des variables d'environnement internes à la
	configuration d'Apache et de celles transmises depuis le shell,
	les scripts CGI	et les pages SSI
	se voient affectés un ensemble de variables
	d'environnement contenant des méta-informations à propos de la requête
	comme préconisé dans la
	<a href="http://www.ietf.org/rfc/rfc3875">spécification
	sur les CGIs</a>.</p>

    </section>
    <section id="caveats">
        <title>Quelques mises en garde</title>

        <ul>
          <li>Les directives de manipulation de l'environnement ne permettent
	  pas de supplanter ou modifier les variables CGI standards.</li>

          <li>Lorsqu'on utilise <program>suexec</program> pour exécuter des
	  scripts CGI, l'environnement est nettoyé et réduit à un ensemble de
	  variables <em>sûres</em> avant l'exécution du script. La liste des
	  variables <em>sûres</em> est définie à la compilation dans
          <code>suexec.c</code>.</li>

          <li>Pour des raisons de portabilité, les noms des variables
	  d'environnement ne peuvent contenir que des lettres, des chiffres, et
	  le caractère "sousligné". En outre, le premier caractère ne doit pas
	  être un chiffre. Les caractères qui ne satisfont pas à ces conditions
	  seront remplacés par un caractère "sousligné" quand ils seront
	  transmis aux scripts CGI et aux pages SSI.</li>

	  <li>Les contenus d'en-têtes HTTP transmis aux scripts de type
	  CGI ou autre via des variables d'environnement constituent un
	  cas particulier (voir plus loin). Leur nom est converti en
	  majuscules et seuls les tirets sont remplacés par des
	  caractères '_' ("souligné") ; si le format du nom de l'en-tête
	  n'est pas valide, celui-ci est ignoré. Voir <a
	  href="#fixheader">plus loin</a> pour une solution de
	  contournement du problème.</li>

          <li>La directive <directive
	  module="mod_env">SetEnv</directive> s'exécute assez tard au
	  cours du traitement de la requête, ce qui signifie que des
	  directives telles que <directive
	  module="mod_setenvif">SetEnvIf</directive> et <directive
          module="mod_rewrite">RewriteCond</directive> ne verront pas
	  les variables qu'elle aura définies.</li>

	  <li>Lorsque le serveur cherche un chemin via une <glossary
   ref="subrequest">sous-requête</glossary> interne (par exemple la
   recherche d'un <directive
   module="mod_dir">DirectoryIndex</directive>), ou lorsqu'il génère un
   listing du contenu d'un répertoire via le module
   <module>mod_autoindex</module>, la sous-requête n'hérite pas des
   variables d'environnement spécifiques à la requête. En outre, à cause
   des phases de l'API auxquelles <module>mod_setenvif</module> prend
   part, les directives <directive
   module="mod_setenvif">SetEnvIf</directive> ne sont pas évaluées
   séparément dans la sous-requête.</li>
        </ul>
    </section>
  </section>
  <section id="using">
    <title>Utilisation des variables d'environnement</title>

    <related>
      <modulelist>
        <module>mod_authz_host</module>
        <module>mod_cgi</module>
        <module>mod_ext_filter</module>
        <module>mod_headers</module>
        <module>mod_include</module>
        <module>mod_log_config</module>
        <module>mod_rewrite</module>
      </modulelist>
      <directivelist>
        <directive module="mod_authz_core">Require</directive>
        <directive module="mod_log_config">CustomLog</directive>
        <directive module="mod_access_compat">Deny</directive>
        <directive module="mod_ext_filter">ExtFilterDefine</directive>
        <directive module="mod_headers">Header</directive>
        <directive module="mod_log_config">LogFormat</directive>
        <directive module="mod_rewrite">RewriteCond</directive>
        <directive module="mod_rewrite">RewriteRule</directive>
      </directivelist>
    </related>

    <section id="cgi-scripts">
        <title>Scripts CGI</title>

        <p>La communication d'informations aux scripts CGI constitue une des
	principales utilisations des variables d'environnement. Comme indiqué
	plus haut, l'environnement transmis aux scripts CGI comprend des
	méta-informations standards à propos de la requête, en plus des
	variables définies dans la configuration d'Apache. Pour plus de
	détails, se référer au
        <a href="howto/cgi.html">tutoriel CGI</a>.</p>

    </section>
    <section id="ssi-pages">
        <title>Pages SSI</title>

        <p>Les documents inclus côté serveur (SSI) traités par le filtre
        <code>INCLUDES</code> du module <module>mod_include</module>,
	peuvent afficher les
	variables d'environnement à l'aide de l'élément <code>echo</code>,
	et peuvent utiliser des variables d'environnement dans les éléments
	de contrôle de flux pour rendre certaines parties d'une page
        conditionnelles en fonction des caractéristiques de la requête.
	Apache fournit aussi les variables d'environnement CGI standards
	aux pages SSI
	comme indiqué plus haut. Pour plus de détails, se référer au
	<a href="howto/ssi.html">tutoriel SSI</a>.</p>

    </section>
    <section id="access-control">
        <title>Contrôle d'accès</title>

        <p>L'accès au serveur peut être contrôlé en fonction de la valeur de
	variables d'environnement à l'aide des directives
	<code>allow from env=</code> et <code>deny from env=</code>.
	En association avec la directive
        <directive module="mod_setenvif">SetEnvIf</directive>, ceci confère une
	grande souplesse au contrôle d'accès au serveur en fonction des
	caractéristiques du client. Par exemple, vous pouvez utiliser ces
        directives pour interdire l'accès depuis un navigateur particulier
	(User-Agent).
        </p>

    </section>
    <section id="logging">
        <title>Enregistrement conditionnel des traces</title>

        <p>Les variables d'environnement peuvent être enregistrées dans le
	fichier de log des accès à l'aide de l'option <code>%e</code> de la
	directive <directive module="mod_log_config">LogFormat</directive>.
	En outre, la décision de tracer ou non les requêtes peut être prise
	en fonction de l'état de variables d'environnement en utilisant la
	forme conditionnelle de la directive
        <directive module="mod_log_config">CustomLog</directive>. En
	association avec la directive <directive module="mod_setenvif"
        >SetEnvIf</directive>, ceci confère une grande souplesse au contrôle
	du traçage des requêtes. Par exemple, vous pouvez choisir de ne pas
	tracer les requêtes pour des noms de fichiers se terminant par
	<code>gif</code>, ou encore de ne tracer que les requêtes des clients
	n'appartenant pas à votre sous-réseau.</p>

    </section>
    <section id="response-headers">
        <title>En-têtes de réponse conditionnels</title>

        <p>La directive <directive module="mod_headers">Header</directive>
        peut se baser sur la présence ou l'absence d'une variable
	d'environnement pour décider si un certain en-tête HTTP sera placé
	dans la réponse au client. Ceci permet, par exemple, de n'envoyer un
	certain en-tête de réponse que si un en-tête correspondant est présent
	dans la requête du client.</p>

    </section>

    <section id="external-filter">
        <title>Activation de filtres externes</title>

        <p>Les filtres externes configurés par le module
	<module>mod_ext_filter</module> à l'aide de la directive <directive
        module="mod_ext_filter">ExtFilterDefine</directive> peuvent être
	activés de manière conditionnelle en fonction d'une variable
	d'environnement à l'aide des options
        <code>disableenv=</code> et <code>enableenv=</code>.</p>
    </section>

    <section id="url-rewriting">
        <title>Réécriture d'URL</title>

        <p>La forme <code>%{ENV:<em>variable</em>}</code> de
	<em>TestString</em> dans la
	directive <directive module="mod_rewrite">RewriteCond</directive>
        permet au moteur de réécriture du module
	<module>mod_rewrite</module> de prendre des
	décisions conditionnées par des variables d'environnement.
        Notez que les variables accessibles dans
	<module>mod_rewrite</module> sans le préfixe
        <code>ENV:</code> ne sont pas de véritables variables
	d'environnement. Ce sont plutôt des variables spécifiques à
	<module>mod_rewrite</module>
        qui ne sont pas accessibles pour les autres modules.</p>
    </section>
  </section>

  <section id="special">
    <title>Variables d'environnement à usage spécial</title>

        <p>Des problèmes d'interopérabilité ont conduit à l'introduction de
	mécanismes permettant de modifier le comportement d'Apache lorsqu'il
	dialogue avec certains clients. Afin de rendre ces mécanismes aussi
	souples que possible, ils sont invoqués en définissant des variables
	d'environnement, en général à l'aide de la directive
	<directive module="mod_setenvif">BrowserMatch</directive>, bien que les
	directives <directive module="mod_env">SetEnv</directive> et
	<directive module="mod_env">PassEnv</directive> puissent aussi être
	utilisées, par exemple.</p>

    <section id="downgrade">
        <title>downgrade-1.0</title>

        <p>Ceci force le traitement d'une requête comme une requête HTTP/1.0
        même si elle a été rédigée dans un langage plus récent.</p>

    </section>
    <section id="force-gzip">
        <title>force-gzip</title>
          <p>Si le filtre <code>DEFLATE</code> est activé, cette variable
	  d'environnement ignorera les réglages accept-encoding de votre
	  navigateur et enverra une sortie compressée inconditionnellement.</p>
    </section>
    <section id="force-no-vary">
        <title>force-no-vary</title>

        <p>Cette variable entraîne la suppression de tout champ
	<code>Vary</code> des en-têtes de la réponse avant que cette dernière
	soit renvoyée au client. Certains clients n'interprètent pas ce champ
	correctement, et la définition de cette variable permet de contourner
	ce problème, mais implique aussi la définition de
	<strong>force-response-1.0</strong>.</p>

    </section>
    <section id="force-response">
        <title>force-response-1.0</title>

      <p>Cette variable force une réponse en langage HTTP/1.0 aux clients
      qui envoient des requêtes dans le même langage. Elle fut implémentée à
      l'origine suite à des problèmes avec les mandataires d'AOL. Certains
      clients en langage HTTP/1.0 ne réagissent pas correctement face à une
      réponse en langage HTTP/1.1, et cette variable peut être utilisée pour
      assurer l'interopérabilité avec eux.</p>

    </section>

    <section id="gzip-only-text-html">
        <title>gzip-only-text/html</title>

        <p>Positionnée à "1", cette variable désactive le filtre en sortie
	<code>DEFLATE</code> fourni par le module <module>mod_deflate</module> pour les
	types de contenu autres que <code>text/html</code>. Si vous préférez
	utiliser des fichiers compressés statiquement,
	<module>mod_negotiation</module> évalue aussi la variable (non
	seulement pour gzip, mais aussi pour tous les encodages autres que
	"identity").</p>
    </section>

    <section id="no-gzip"><title>no-gzip</title>

        <p>Quand cette variable est définie, le filtre <code>DEFLATE</code> du
	module <module>mod_deflate</module> est désactivé, et
        <module>mod_negotiation</module> refusera de délivrer des ressources
	encodées.</p>

    </section>

    <section id="no-cache"><title>no-cache</title>
    	<p><em>Disponible dans les versions 2.2.12 et ultérieures d'Apache</em></p>

        <p>Lorsque cette variable est définie,
	<module>mod_cache</module> ne sauvegardera pas de réponse
	susceptible d'être mise en cache. Cette variable d'environnement
	n'a aucune incidence sur le fait qu'une réponse déjà enregistrée
	dans la cache soit utilisée ou non pour la requête courante.</p>

    </section>

    <section id="nokeepalive">
        <title>nokeepalive</title>

        <p>Quand cette variable est définie, la directive
	<directive module="core">KeepAlive</directive> est désactivée.</p>

    </section>

    <section id="prefer-language"><title>prefer-language</title>

        <p>Cette variable modifie le comportement du module
	<module>mod_negotiation</module>. Si elle contient un symbole de
	langage (tel que <code>en</code>, <code>ja</code>
        ou <code>x-klingon</code>), <module>mod_negotiation</module> essaie de
	délivrer une variante dans ce langage. S'il n'existe pas de telle
	variante, le processus normal de
	<a href="content-negotiation.html">négociation</a> s'applique.</p>

    </section>

    <section id="redirect-carefully">
        <title>redirect-carefully</title>

        <p>Cette variable force le serveur à être plus prudent lors de l'envoi
	d'une redirection au client. Elle est en général utilisée quand un
	client présente un problème connu avec les redirections. Elle fut
	implémentée à l'origine suite a un problème rencontré avec le logiciel
	WebFolders de Microsoft qui ne gère pas correctement les redirections
	vers des ressources de type répertoire via des méthodes DAV.</p>

    </section>

   <section id="suppress-error-charset">
       <title>suppress-error-charset</title>

    <p><em>Disponible dans les versions postérieures à 2.0.54</em></p>

    <p>Quand Apache génère une redirection en réponse à une requête client,
    la réponse inclut un texte destiné à être affiché au cas où le client ne
    suivrait pas, ou ne pourrait pas suivre automatiquement la redirection.
    Habituellement, Apache marque ce texte en accord avec le jeu de caractères
    qu'il utilise, à savoir ISO-8859-1.</p>
    <p> Cependant, si la redirection fait référence à une page qui utilise un
    jeu de caractères différent, certaines versions de navigateurs obsolètes
    essaieront d'utiliser le jeu de caractères du texte de la redirection
    plutôt que celui de la page réelle.
    Ceci peut entraîner, par exemple, un rendu incorrect du Grec.</p>
    <p>Si cette variable d'environnement est définie, Apache omettra le jeu de
    caractères pour le texte de la redirection, et les navigateurs obsolètes
    précités utiliseront correctement celui de la page de destination.</p>

    <note type="warning">
      <title>Note concernant la sécurité</title>

      <p>L'envoi de pages d'erreur sans spécifier un jeu de caractères peut
      conduire à des attaques de type "cross-site-scripting" pour les
      navigateurs qui ne respectent pas la spécification HTTP/1.1 (MSIE) et
      tentent de déduire le jeu de caractères à partir du contenu. De tels
      navigateurs peuvent être facilement trompés et utiliser le jeu de
      caractères UTF-7 ; les contenus des données en entrée de type UTF-7
      (comme les URI de requête) ne seront alors plus protégés par les
      mécanismes d'échappement usuels conçus pour prévenir les attaques
      de type "cross-site-scripting".</p>
    </note>

   </section>

   <section id="proxy"><title>force-proxy-request-1.0, proxy-nokeepalive, proxy-sendchunked,
   proxy-sendcl, proxy-chain-auth, proxy-interim-response, proxy-initial-not-pooled</title>

   <p>Ces directives modifient le comportement protocolaire du module
   <module>mod_proxy</module>.  Voir la documentation sur
   <module>mod_proxy</module> et <module>mod_proxy_http</module> pour plus de détails.</p>
   </section>

  </section>

  <section id="examples">
    <title>Exemples</title>

    <section id="fixheader">
      <title>Transmission du contenu d'en-têtes non valides aux scripts
      CGI</title>

      <p>Avec la version 2.4, Apache est plus strict avec la conversion
      des en-têtes HTTP en variables d'environnement dans
      <module>mod_cgi</module> et d'autres modules : dans les versions
      précédentes, tout caractère invalide dans les noms d'en-têtes
      était tout simplement remplacé par un caractère '_', ce qui
      pouvait exposer à des attaques de type cross-site-scripting via
      injection d'en-têtes (voir <a
      href="http://events.ccc.de/congress/2007/Fahrplan/events/2212.en.html">Bogues
      du Web inhabituelles</a>, planche 19/20).</p>

      <p>Si vous devez supporter un client qui envoie des en-têtes non
      conformes et si ceux-ci ne peuvent pas être corrigés, il existe
      une solution de contournement simple mettant en jeu les modules
      <module>mod_setenvif</module> et <module>mod_headers</module>,
      et permettant de prendre en compte ces en-têtes :</p>

<highlight language="config">
# L'exemple suivant montre comment prendre en compte un en-tête<br />
# Accept_Encoding non conforme envoyé par un client.
#
SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1
RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding
</highlight>

    </section>

    <section id="misbehaving">
        <title>Modification du comportement protocolaire face à des clients
	réagissant de manière non conforme</title>

        <p>Les versions antérieures recommandaient l'ajout de ces lignes dans
        httpd.conf pour tenir compte de problèmes connus avec certains clients.
	Comme les clients concernés sont maintenant très peu utilisés, cet
	ajout n'est pratiquement plus nécessaire.</p>
<highlight language="config">
#
# The following directives modify normal HTTP response behavior.
# The first directive disables keepalive for Netscape 2.x and browsers that
# spoof it. There are known problems with these browser implementations.
# The second directive is for Microsoft Internet Explorer 4.0b2
# which has a broken HTTP/1.1 implementation and does not properly
# support keepalive when it is used on 301 or 302 (redirect) responses.
#
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0

#
# The following directive disables HTTP/1.1 responses to browsers which
# are in violation of the HTTP/1.0 spec by not being able to grok a
# basic 1.1 response.
#
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0
</highlight>

    </section>
    <section id="no-img-log">
        <title>Ne pas tracer les requêtes pour des images dans le fichier de
	trace des accès</title>

        <p>Dans cet exemple, les requêtes pour des images n'apparaissent pas
	dans le fichier de trace des accès. Il peut être facilement adapté pour
	empêcher le traçage de répertoires particuliers, ou de requêtes
        en provenance de certains hôtes.</p>
         <highlight language="config">
SetEnvIf Request_URI \.gif image-request
SetEnvIf Request_URI \.jpg image-request
SetEnvIf Request_URI \.png image-request
CustomLog "logs/access_log" common env=!image-request
        </highlight>

    </section>
    <section id="image-theft">
        <title>Prévention du "Vol d'image"</title>

        <p>Cet exemple montre comment empêcher les utilisateurs ne faisant pas
	partie de votre serveur d'utiliser des images de votre serveur comme
	images en ligne dans leurs pages. Cette configuration n'est pas
	recommandée, mais elle peut fonctionner dans des circonstances bien
	définies. Nous supposons que toutes vos images sont enregistrées dans
	un répertoire nommé <code>/web/images</code>.</p>
    	<highlight language="config">
SetEnvIf Referer "^http://www\.example\.com/" local_referal
# Autorise les navigateurs qui n'envoient aucune information de Referer
SetEnvIf Referer "^$" local_referal
&lt;Directory "/web/images"&gt;
    Require env local_referal
&lt;/Directory&gt;
        </highlight>

        <p>Pour plus d'informations sur cette technique, voir le tutoriel sur
	ServerWatch
	"<a href="http://www.serverwatch.com/tutorials/article.php/1132731"
	>Keeping Your Images from Adorning Other Sites</a>".</p>
    </section>
  </section>
</manualpage>
